# 源代码已上传gitee，欢迎访问---> @tommonkeyman
# 导入读取excel模块和连接模块
import xlrd
import time
import paramiko


def dealDate():
    # 异常捕获
    try:
        print('''
----------------------------------------------------------------------------------------------
                     AutoTool(v2.1.1).producer by Liudongdong\n
       远程设备需支持SSH协议和命令行模式,即可使用此脚本来对远程设备进行批量的命令操作
           Remote devices need to support SSH protocols and command line modes\n    
----------------------------------------------------------------------------------------------''')

        Judge = "y"
        while Judge == "y":  # 判断是否重新启动此程序
            path = input('请输入要读取excel表格的绝对地址(注意excel表格需按照：ip，用户名，密码三列排列，顺序不可打乱):\n')
            if path == "":
                print('输入为空!，请重试!')
                continue

            Dates = xlrd.open_workbook(path, 'rb')  # 获取excel表格内容,以二进制的形式

            table = Dates.sheets()[0]  # excel中的第一张表
            row = table.nrows
            col = table.ncols
            row -= 1  # 跳过列名，直接获取excel的数据

            # 回显数据
            print('上传EXCEL文件"数据"部分的基本信息:\n------------------------------------------------------------------------\n'
                  '行数:{}\n列数:{}\n------------------------------------------------------------------------'.format(row,
                                                                                                                  col))
            time.sleep(0.5)
            # 输出表格的内容，进行数据处理前的最后检查
            t = row + 1
            for i in range(t):
                # print(row)
                all_data = table.row_values(i)
                print(all_data)

            print(
                "------------------------------------------------------------------------\n请在数据执行前仔细检查是否有NAN值，若有NAN值请立即停止运行！\n若与本地上传文件信息不一致，请停止运行！")

            status = input('continue?(y/n):')

            # 进入数据处理部分
            if status == 'y':
                list1 = []
                commond_num = int(input('请输入本次要执行的命令的条数:'))
                time.sleep(0.5)
                print('好的，你本次需执行的命令条数为:{}条\n请按命令的顺序输入'.format(commond_num))
                for n in range(commond_num):  # 注意，如果第一条命令就是quit，q之类的，连接会直接关闭。
                    getIn = input('请输入第{}条命令:'.format(n + 1))
                    list1.append(getIn)  # 把要输入的命令都放在列表里面
                print('你要执行的命令顺序如下:\n------------------------------------------------------------------------\n', list1)
                status1 = input('------------------------------------------------------------------------\n是否继续？(y/n):')

                if status1 == 'y':

                    for R in range(row):
                        UserIP = table.cell(R + 1, 0).value
                        UsernameCell = table.cell(R + 1, 1).value  # 将连接的用户名，ip，密码赋值
                        UserPasswd = table.cell(R + 1, 2).value

                        print('当前正在处理的终端的IP:{}\n用户名:{}\n用户密码:{}'.format(UserIP, UsernameCell,
                                                                        UserPasswd))  # 输出信息，检查信息是否正确

                        # 创建ssh对象
                        ssh = paramiko.SSHClient()
                        ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())  # 设置无需保存密钥也可连接
                        ssh.connect(hostname=UserIP, port=22, username=UsernameCell, password=UserPasswd)

                        chan = ssh.invoke_shell()  # 实现交互式shell，不会关闭通道，比exec_command()要方便

                        # 其他的传参方法我都试过了，就这一种方法可以传进去。
                        for w in range(commond_num):
                            p = list1[w]  # 按顺序去值赋给p
                            chan.send(p)  # 传参
                            chan.send('\n')  # 必须要换行，不然无法执行命令
                            time.sleep(1)

                        info = chan.recv(9999).decode()
                        time.sleep(2)
                        print(
                            '------------------------------------------------------------------------\n当前正在执行的设备IP:{}'.format(
                                UserIP))
                        time.sleep(0.5)
                        print(info)
                        time.sleep(2)
                        with open(r'log.txt', 'a') as inlog:  # 将命令行信息记录到日志
                            inlog.write(UserIP)
                            inlog.write(info)

                        ssh.close()  # 关闭连接
                else:
                    print('已停止，请重试!')
                    continue
            else:
                print("已停止，请重试!")
                continue
            print('执行成功!')
            Judge=input("------------------------------------------------------------------------\n是否重新启动此程序模块(y/n):")


    except Exception as err:
        print('输入有误或运行出错，已停止运行', err)

    result = '执行完毕!'
    return result

dealDate()
input("please input any key to exit!")






